#ifndef ROUTESERVICE_H
#define ROUTESERVICE_H

#include <QObject>
#include <QVariantList>
#include <QVariantMap>
#include <QString>
#include <QNetworkAccessManager>
#include <QNetworkReply>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>

/**
 * @brief 路线规划服务类
 * 
 * 支持多种路线规划API：
 * - OpenRouteService (推荐)
 * - Google Directions API
 * - Bing Maps API
 * - 自定义直线规划
 */
class RouteService : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString provider READ provider WRITE setProvider NOTIFY providerChanged)
    Q_PROPERTY(QString apiKey READ apiKey WRITE setApiKey NOTIFY apiKeyChanged)
    Q_PROPERTY(bool isPlanning READ isPlanning NOTIFY isPlanningChanged)
    
public:
    explicit RouteService(QObject *parent = nullptr);
    ~RouteService();
    
    // 路线服务提供商枚举
    enum RouteProvider {
        DirectLine,           // 直线规划（默认，无需API密钥）
        OpenRouteService,     // OpenRouteService (推荐)
        GoogleDirections,     // Google Directions API
        BingMaps             // Bing Maps API
    };
    Q_ENUM(RouteProvider)
    
    // 属性访问器
    QString provider() const { return m_provider; }
    void setProvider(const QString &provider);
    
    QString apiKey() const { return m_apiKey; }
    void setApiKey(const QString &apiKey);
    
    bool isPlanning() const { return m_isPlanning; }
    
public slots:
    /**
     * @brief 请求路线规划
     * @param waypoints 路径点列表 [{lon: 经度, lat: 纬度}, ...]
     */
    void requestRoute(const QVariantList &waypoints);
    
    /**
     * @brief 设置路线服务提供商
     * @param provider 提供商名称 ("direct", "openroute", "google", "bing")
     */
    void setRouteProvider(const QString &provider);
    
    /**
     * @brief 清除当前路线
     */
    void clearRoute();
    
    /**
     * @brief 取消正在进行的路线规划请求
     */
    void cancelRequest();
    
signals:
    /**
     * @brief 路线规划完成信号
     * @param path 路线坐标点列表 [{lon: 经度, lat: 纬度}, ...]
     * @param distance 总距离（米）
     * @param duration 预计时长（秒）
     */
    void routeReady(const QVariantList &path, double distance, double duration);
    
    /**
     * @brief 路线规划错误信号
     * @param error 错误信息
     */
    void routeError(const QString &error);
    
    /**
     * @brief 路线规划进度信号
     * @param percentage 进度百分比 (0-100)
     */
    void routeProgress(int percentage);
    
    void providerChanged();
    void apiKeyChanged();
    void isPlanningChanged();
    
private slots:
    void onNetworkReplyFinished();
    void onNetworkError(QNetworkReply::NetworkError error);
    
private:
    // 路线规划方法
    void planDirectLine(const QVariantList &waypoints);
    void planOpenRouteService(const QVariantList &waypoints);
    void planGoogleDirections(const QVariantList &waypoints);
    void planBingMaps(const QVariantList &waypoints);
    
    // 解析响应
    void parseOpenRouteServiceResponse(const QByteArray &data);
    void parseGoogleDirectionsResponse(const QByteArray &data);
    void parseBingMapsResponse(const QByteArray &data);
    
    // 工具函数
    double calculateDistance(double lon1, double lat1, double lon2, double lat2);
    QVariantList interpolatePoints(double lon1, double lat1, double lon2, double lat2, int segments);
    QVariantList decodePolyline(const QString &encoded);
    
private:
    QNetworkAccessManager *m_networkManager;
    QNetworkReply *m_currentReply;
    
    QString m_provider;           // 当前提供商
    QString m_apiKey;             // API密钥
    bool m_isPlanning;            // 是否正在规划
    
    RouteProvider m_currentProvider;
    QVariantList m_currentWaypoints;
};

#endif // ROUTESERVICE_H


